package com.leetcode.partition9;

/**
 * @author `RKC`
 * @date 2021/11/23 12:28m
 */
public class LC859亲密字符串 {

    public static boolean buddyStrings(String s, String goal) {
        //当 s 与 goal 长度或词频不同，必然不为亲密字符
        //当「s 与 goal 不同的字符数量为 2（能够相互交换）」或「s 与 goal 不同的字符数量为 0，但同时 s 中有出现数量超过 2 的字符（能够相互交换）」时，
        //两者必然为亲密字符。
        if (s.length() != goal.length()) return false;
        int[] cnt1 = new int[26], cnt2 = new int[26];
        //记录字符串不同字符的数量
        int sum = 0;
        for (int i = 0; i < s.length(); i++) {
            int a = s.charAt(i) - 'a', b = goal.charAt(i) - 'a';
            cnt1[a]++;
            cnt2[b]++;
            if (a != b) sum++;
        }
        boolean flag = false;
        for (int i = 0; i < 26; i++) {
            if (cnt1[i] != cnt2[i]) return false;
            if (cnt1[i] > 1) flag = true;
        }
        return sum == 2 || (sum == 0 && flag);
    }
}
